home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / answrbok / 6_10.lha / 6_10 / 6_10neg.c < prev    next >
Text File  |  1993-08-08  |  1KB  |  63 lines

  1. * Copyright (c) 1990 by AT&T Bell Telephone Laboratories, Incorporated. */
  2. * The C++ Answer Book */
  3. * Tony Hansen */
  4. * All rights reserved. */
  5. *
  6.    Negate u[1..n] to form w[0..n]
  7.    Uses a variation on:
  8.  
  9.    The Art of Computer Programming, volume 2
  10.    D. Knuth, Section 4.3.1, Algorithm A
  11. /
  12. include <lint.h>
  13.  
  14. INT operator-(LINT u)
  15.  
  16.    LINT w;
  17.  
  18.    /*
  19. A1 [Initialize]
  20.     set j <- n
  21.     k <- 0
  22. becomes
  23.     k <- 1
  24.    */
  25.    LINT_Ltype k = 1;
  26.    for (int j = 3; ; )
  27. {
  28. /*
  29.     A2(a) [Add digits]
  30.     set w[j] <- (u[j] + v[j] + k) mod b
  31.     becomes
  32.     set w[j] <- (~u[j] + k) mod b
  33. */
  34.                                                             // cerr << "u=" << form("%4.4x", u.s[j]) << "\n";    /* DELETE */
  35. LINT_type l1 = ~u.s[j];
  36. LINT_Ltype l = l1 + k;
  37.                                                             // cerr << "l=" << form("%4.4x", l) << "\n";    /* DELETE */
  38. w.s[j] = l;    // % LINT_base
  39.                                                             // cerr << "w=" << form("%4.4x", w.s[j]) << "\n";    /* DELETE */
  40.  
  41. /*
  42.     A3 [Loop on j]
  43.     decrease j by one
  44. */
  45. if (--j < 0)
  46.     break;
  47.  
  48. /*
  49.     A2(b)
  50.     k <- (u[j] + v[j] + k) / b
  51. */
  52. k = (l / LINT_base) ? 1 : 0;
  53.                                                             // cerr << "k=" << form("%4.4x", k) << "\n";    /* DELETE */
  54. }
  55.  
  56.    /*
  57. A3(b)
  58.     Set w[0] <- k
  59. { modification: ignore overflow into w[0] }
  60.    */
  61.    return w;
  62.  
  63.